﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Windows.Forms;

namespace elcalc
{
    public class Kabel
    {
        public string Navn { get; set; }
        public double Længde { get; set; }
        public string Type { get; set; }
        public Complex Z { get; set; }
        public Complex Z15 { get; set; }
        public Complex Z115 { get; set; }
        public Complex Zn15 { get; set; }
        public Complex Zn115 { get; set; }
        public double SpændingsFald { get; set; }
        public double SpændingsFaldProcent { get; set; }
        public double SpændingsFaldProcentSamlet { get; set; }

        public double Current { get; set; }

        /// <summary>
        /// Henter/Gemmer belastningsstrømmen på L1
        /// </summary>
        public Complex L1 { get; set; }
        /// <summary>
        /// Henter/Gemmer belastningsstrømmen på L2
        /// </summary>
        public Complex L2 { get; set; }
        /// <summary>
        /// Henter/Gemmer belastningsstrømmen på L3
        /// </summary>
        public Complex L3 { get; set; }
        /// <summary>
        /// Henter/Gemmer hvilken form for last kablet bærer.
        /// (L1L2L3 hvis det føder en tavle)
        /// Anden fordeling hvis det føder en brugsgenstand.
        /// </summary>
        public lastdeling last { get; set; }

        public Kabel(){}

        public override string ToString()
        {
            return string.Format("{0} ({1})", Navn,Længde);
        }
    }

    public class Tavle
    {
        public Tavle() { }

        public override string ToString()
        {
            return "Tavle";
        }
    }

    public static class FormatExtensions
    {
        public static string ToEngineering(this double value)
        {
            int exp = (int)(Math.Floor(Math.Log10(value) / 3.0) * 3.0);
            double newValue = value * Math.Pow(10.0, -exp);
            if (newValue >= 1000.0)
            {
                newValue = newValue / 1000.0;
                exp = exp + 3;
            }
            if (exp != 0)
                return string.Format("{0:##.##}e{1}", newValue, exp);
            else
                return string.Format("{0:##.##}", newValue);
        }
    }


    public static class Hjælper
    {
        public static void ErstatNode(TreeNode startNode, TreeNode søgEfterNode, TreeNode erstatMedNode)
        {
            for (int i = 0; -i < startNode.Nodes.Count; i++)
            {
                if (startNode.Nodes[i].Equals(søgEfterNode))
                {
                    startNode.Nodes[i] = erstatMedNode;
                }

                ErstatNode(startNode.Nodes[i], søgEfterNode, erstatMedNode);
            }
        }

        public static Complex ParseComplex(string value)
        {
            int number;
            Complex kompleks;
            value = value.Replace(" ", "");
            
            if (value.Contains("+j") | value.Contains("-j"))
            {
                string[] values = value.Split(new string[] {"+j","-j"}, StringSplitOptions.RemoveEmptyEntries);
                kompleks = new Complex(double.Parse(values[0]), double.Parse(values[1]));
            }
            else if (value.Contains("<"))
            {
                string[] values = value.Split('<');
                kompleks = Complex.FromPolarCoordinates(double.Parse(values[0]), double.Parse(values[1]) * (Math.PI / 180));
            }
            else if (int.TryParse(value, out number))
            {
                kompleks = Complex.FromPolarCoordinates(double.Parse(value), 0);
            }
            else
            {
                throw new FormatException();
            }

            return kompleks;
        }

    }

    public enum lastdeling { L1N, L2N, L3N, L1L2, L2L3, L1L3, L1L2L3 };

    public class Forbrug
    {
        public string Navn { get; set; }
        public lastdeling last;
        public double Strøm { get; set; }
        //public Complex Strøm { get; set; }
        public double CosPhi { get; set; }
        public double SinPhi { get; set; }
        public double Phi { get; set; }

        public Forbrug() { }
    }

    // TODO: tilføje uf/un til klassen.
    public class Transformer
    {
        public float ikmax { get; set; }
        public float ikmin { get; set; }
        public float phiikmax { get; set; }
        public float phiikmin { get; set; }


        private float sn;
        private float er;
        private float ek;
        // private Complex32 z;

        public Transformer() { }

        public float SN
        {
            get { return this.sn; }
            set { this.sn = value; }
        }
        public float ER
        {
            get { return this.er; }
            set { this.er = value; }
        }
        public float EK
        {
            get { return this.ek; }
            set { this.ek = value; }
        }
        public void calc()
        {

            double zt = 5.5 * Math.Pow(420, 2);
        }
    }
}
